/**
 * EditBook 富文本编辑器主文件
 * 负责初始化和协调各个模块
 */
import EditorCore from './modules/EditorCore.js';
import MenuBar from './modules/MenuBar.js';
import FileManager from './modules/FileManager.js';
import { Toolbar } from './modules/Toolbar.js';

class EditBookApp {
  constructor() {
    this.editorCore = null;
    this.menuBar = null;
    this.fileManager = null;
    this.toolbar = null;
    this.isInitialized = false;
    this.autoSaveEnabled = false;
    this.autoSaveTimer = null;
  }

  /**
   * 初始化应用程序
   */
  async init() {
    try {
      console.log('正在初始化 EditBook 应用程序...');

      // 初始化编辑器核心
      this.editorCore = new EditorCore('editor', 'toolbar');
      this.editorCore.init();

      // 初始化文件管理器
      this.fileManager = new FileManager();

      // 初始化工具栏
      this.toolbar = new Toolbar(this.editorCore);
      this.toolbar.init();

      // 初始化菜单栏
      this.menuBar = new MenuBar(this.editorCore, this.fileManager);
      this.menuBar.init();

      // 绑定应用程序级别的事件
      this.bindAppEvents();

      // 设置窗口关闭前的确认
      this.setupBeforeUnload();

      // 初始化完成后的设置
      this.setupInitialState();

      this.isInitialized = true;
      console.log('EditBook 应用程序初始化完成');

    } catch (error) {
      console.error('应用程序初始化失败:', error);
      this.showError('应用程序初始化失败: ' + error.message);
    }
  }

  /**
   * 绑定应用程序级别的事件
   */
  bindAppEvents() {
    // 监听编辑器内容变化
    this.editorCore.on('content-changed', (data) => {
      this.onContentChanged(data);
    });

    // 监听编辑器选择变化
    this.editorCore.on('selection-changed', (data) => {
      this.onSelectionChanged(data);
    });

    // 监听窗口大小变化
    window.addEventListener('resize', () => {
      this.onWindowResize();
    });

    // 监听拖拽文件
    this.setupFileDrop();
  }

  /**
   * 内容变化处理
   * @param {Object} data - 变化数据
   */
  onContentChanged(data) {
    // 更新菜单状态
    if (this.menuBar) {
      this.menuBar.updateMenuState();
    }

    // 更新窗口标题显示未保存状态
    this.updateTitleWithUnsavedIndicator();
  }

  /**
   * 选择变化处理
   * @param {Object} data - 选择数据
   */
  onSelectionChanged(data) {
    // 可以在这里添加选择相关的逻辑
    // 例如更新格式化按钮状态等
  }

  /**
   * 窗口大小变化处理
   */
  onWindowResize() {
    // 可以在这里添加响应式布局调整
  }

  /**
   * 设置文件拖拽功能
   */
  setupFileDrop() {
    const appContainer = document.querySelector('.app-container');
    if (!appContainer) return;

    // 防止默认的拖拽行为
    ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
      appContainer.addEventListener(eventName, (e) => {
        e.preventDefault();
        e.stopPropagation();
      });
    });

    // 拖拽进入和离开的视觉反馈
    ['dragenter', 'dragover'].forEach(eventName => {
      appContainer.addEventListener(eventName, () => {
        appContainer.classList.add('drag-over');
      });
    });

    ['dragleave', 'drop'].forEach(eventName => {
      appContainer.addEventListener(eventName, () => {
        appContainer.classList.remove('drag-over');
      });
    });

    // 处理文件拖拽
    appContainer.addEventListener('drop', async (e) => {
      const files = Array.from(e.dataTransfer.files);
      if (files.length > 0) {
        await this.handleDroppedFile(files[0]);
      }
    });
  }

  /**
   * 处理拖拽的文件
   * @param {File} file - 拖拽的文件
   */
  async handleDroppedFile(file) {
    try {
      // 检查是否有未保存的更改
      if (this.editorCore.hasUnsavedChanges()) {
        const shouldSave = confirm('当前文档有未保存的更改，是否保存？');
        if (shouldSave) {
          await this.menuBar.handleSave();
        }
      }

      // 读取文件内容
      const content = await this.readFileContent(file);
      
      // 设置编辑器内容
      this.editorCore.setContent(content, 'html');
      this.editorCore.setCurrentFile(file.name);
      
      // 更新标题
      this.menuBar.updateTitle(file.name);
      
      console.log('文件已通过拖拽打开:', file.name);
    } catch (error) {
      console.error('处理拖拽文件失败:', error);
      this.showError('无法打开拖拽的文件: ' + error.message);
    }
  }

  /**
   * 读取文件内容
   * @param {File} file - 文件对象
   * @returns {Promise<string>} 文件内容
   */
  readFileContent(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = (e) => resolve(e.target.result);
      reader.onerror = (e) => reject(new Error('文件读取失败'));
      reader.readAsText(file);
    });
  }

  /**
   * 设置窗口关闭前的确认
   */
  setupBeforeUnload() {
    window.addEventListener('beforeunload', (e) => {
      if (this.editorCore && this.editorCore.hasUnsavedChanges()) {
        e.preventDefault();
        e.returnValue = '您有未保存的更改，确定要离开吗？';
        return e.returnValue;
      }
    });
  }

  /**
   * 更新标题显示未保存状态
   */
  updateTitleWithUnsavedIndicator() {
    const currentTitle = document.title;
    const hasUnsaved = this.editorCore.hasUnsavedChanges();
    
    if (hasUnsaved && !currentTitle.startsWith('*')) {
      document.title = '*' + currentTitle;
    } else if (!hasUnsaved && currentTitle.startsWith('*')) {
      document.title = currentTitle.substring(1);
    }
  }

  /**
   * 显示欢迎消息
   */
  showWelcomeMessage() {
    const welcomeContent = `
      <h1>欢迎使用 EditBook</h1>
      <p>这是一个功能强大的富文本编辑器，支持以下功能：</p>
      <ul>
        <li>丰富的文本格式化选项</li>
        <li>文件的打开、保存和导出</li>
        <li>撤销和重做操作</li>
        <li>键盘快捷键支持</li>
        <li>拖拽文件打开</li>
        <li>实时字数统计</li>
      </ul>
      <p>开始编写您的文档吧！</p>
    `;
    
    this.editorCore.setContent(welcomeContent, 'html');
    this.editorCore.markAsSaved(); // 标记为已保存，避免退出时提示
  }

  /**
   * 显示错误消息
   * @param {string} message - 错误消息
   */
  showError(message) {
    console.error(message);
    alert('错误: ' + message);
  }

  /**
   * 获取应用程序状态
   * @returns {Object} 应用程序状态
   */
  getAppState() {
    return {
      isInitialized: this.isInitialized,
      hasUnsavedChanges: this.editorCore ? this.editorCore.hasUnsavedChanges() : false,
      currentFile: this.editorCore ? this.editorCore.getCurrentFile() : null,
      wordCount: this.editorCore ? this.editorCore.getLength() : 0
    };
  }

  /**
   * 设置初始状态
   */
  setupInitialState() {
    // 设置默认文档标题
    this.updateDocumentTitle('未命名文档');
    
    // 初始化状态栏
    this.initializeStatusBar();
    
    // 设置焦点到编辑器
    if (this.editorCore && this.editorCore.quill) {
      this.editorCore.quill.focus();
    }
  }

  /**
   * 更新文档标题
   */
  updateDocumentTitle(title) {
    document.title = `${title} - EditBook`;
    
    // 更新状态栏中的文件名
    const statusBar = document.querySelector('.status-bar');
    if (statusBar) {
      let titleElement = statusBar.querySelector('.document-title');
      if (!titleElement) {
        titleElement = document.createElement('span');
        titleElement.className = 'document-title';
        statusBar.appendChild(titleElement);
      }
      titleElement.textContent = title;
    }
  }

  /**
   * 初始化状态栏
   */
  initializeStatusBar() {
    const statusBar = document.querySelector('.status-bar');
    if (statusBar) {
      statusBar.innerHTML = `
        <div class="status-left">
          <span class="document-status">就绪</span>
          <span class="document-title">未命名文档</span>
        </div>
        <div class="status-right">
          <span class="cursor-position">行 1, 列 1</span>
          <span class="word-count">字符: 0 | 单词: 0</span>
        </div>
      `;
    }
  }

  /**
   * 销毁应用程序
   */
  destroy() {
    if (this.autoSaveTimer) {
      clearTimeout(this.autoSaveTimer);
    }
    
    if (this.toolbar) {
      this.toolbar.destroy();
    }
    
    if (this.editorCore) {
      this.editorCore.destroy();
    }
    if (this.menuBar) {
      this.menuBar.destroy();
    }
    this.isInitialized = false;
    console.log('EditBook 应用程序已销毁');
  }
}

// 创建全局应用程序实例
let app = null;

// 当 DOM 加载完成时初始化应用程序
window.addEventListener('DOMContentLoaded', async () => {
  try {
    app = new EditBookApp();
    await app.init();
    
    // 将应用程序实例暴露到全局作用域（用于调试）
    window.editBookApp = app;
  } catch (error) {
    console.error('应用程序启动失败:', error);
  }
});

// 导出应用程序类（如果需要）
export default EditBookApp;
